package conn

import (
	"context"
	"flow-calc/common"
	"flow-calc/config"
	"flow-calc/core"
	"sync"
)

/**
 *    Description: connector 链接器(实现抽象层的connector)
 *    Date: 2024/4/1
 */

type Connector struct {
	CId      string                  // 连接ID
	CName    string                  // 连接器名称
	Conf     *config.ConnectorConfig // 连接配置Config
	onceInit sync.Once               // 首次触发初始化(每个connector)
	metaData map[string]interface{}  // 自定义metaData数据
	mLock    sync.RWMutex            // 管理metaData的读写锁
}

// NewConnector 初始化构建链接器Connector
func NewConnector(config *config.ConnectorConfig) *Connector {
	conn := new(Connector)
	conn.CId = core.KisID(common.ConnectionType)
	conn.CName = config.Cname
	conn.Conf = config
	conn.metaData = make(map[string]interface{})
	return conn
}

// Init 初始化关联存储引擎链接等
func (conn *Connector) Init() error {
	var err error

	conn.onceInit.Do(func() {
		err = core.Pool().CallCaaSInit(conn)
	})
	return err
}

// Call 调用Connector 外挂存储逻辑的读写操作
func (conn *Connector) Call(ctx context.Context, flow core.Flow, args interface{}) error {
	if err := core.Pool().CallCaaS(ctx, flow, conn, args); err != nil {
		return err
	}
	return nil
}

// GetName 获取连接器名称
func (conn *Connector) GetName() string {
	return conn.CName
}

// GetConfig 获取连接器配置
func (conn *Connector) GetConfig() *config.ConnectorConfig {
	return conn.Conf
}

// GetId 获取连接器ID
func (conn *Connector) GetId() string {
	return conn.CId
}

// GetMetaData 获取自定义metaData数据
func (conn *Connector) GetMetaData(key string) interface{} {
	conn.mLock.RLock()
	defer conn.mLock.RUnlock()
	data, ok := conn.metaData[key]
	if !ok {
		return nil
	}
	return data
}

func (conn *Connector) SetMetaData(key string, value interface{}) {
	conn.mLock.Lock()
	defer conn.mLock.Unlock()
	conn.metaData[key] = value
}
